package Arrays方法;

import java.util.Arrays;
import java.util.Comparator;

//对数组的操作
public class ArraysText {
    public static void main(String[] args) {
        System.out.println("---------------Arrays.toString------------------");
        int[] arr = {2, 5, 1, 3, 8, 6, 9, 4, 7};
        //Arrays.toString : 将数组自动拼接并转换成字符串形式
        String s1 = Arrays.toString(arr);
        System.out.println(s1);//[2, 5, 1, 3, 8, 6, 9, 4, 7]

        System.out.println("---------------binarySearch:二分查找法查找元素------------------");

        //二分查找法查找元素 : binarySearch:
        //细节1： 二分查找的前提： 数组中的元素必须是有序，数组中的元素必须是升序的
        //细节2： 如果要查找的元素是存在的，那么返回的是真实的索引
        //但是，如果要查找的元素是不存在的，返回的是插入点 -1
        //疑问： 为什么要减1呢？
        //解释： 如果此时，我现在要查找数字0，那么如果返回的值是插入点，就会出现问题了。
        //如果要查找数字0，此时0是不存在的，但是按照上面的规则插入点，应该就是-0
        //为了避兔这样的情况，Java在这个基础上又减 -1
        //方法1
        int[] arr1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//有序数组
        int i = Arrays.binarySearch(arr1, 5);//查找5的索引位置
        System.out.println(i);

        //方法2
        //（数组,开始索引，结束索引，查找元素）
        int i2 = Arrays.binarySearch(arr1, (Integer) 0, (Integer) 6, 5);
        System.out.println(i2);

        System.out.println("--------------copyof:拷贝数组-------------------");

        // copyof:拷贝数组
        //参数一：老数组
        //参数二：新数组的长度
        //方法的底层会根据第二个参数来创建新的数组
        //如果新数组的长度是小于老数组的长度，会部分拷贝
        //如果新数组的长度是等于老数组的长度，会完全拷贝
        //如果新数组的长度是大于老数组的长度，会补上默认初始值，即0
//        int[] arr1 = {1,2,3,4,5,6,7,8,9,10};//有序数组?
        int[] ints1 = Arrays.copyOf(arr1, 4);//小于
        int[] ints2 = Arrays.copyOf(arr1, 10);//等于
        int[] ints3 = Arrays.copyOf(arr1, arr1.length);//等于
        int[] ints4 = Arrays.copyOf(arr1, 15);//大于

        System.out.println(Arrays.toString(ints1)); //[1, 2, 3, 4]
        System.out.println(Arrays.toString(ints2)); //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        System.out.println(Arrays.toString(ints3)); //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        System.out.println(Arrays.toString(ints4)); //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]

        System.out.println("----------------copyofRange：拷贝数组（指定范围）---------------------");
        //copyofRange：拷贝数组（指定索引的范围）
        //细节：包头不包尾，包左不包右
        //int[] arr1 = {1,2,3,4,5,6,7,8,9,10};//有序数组
        int[] ints = Arrays.copyOfRange(arr1, 0, 5);
        System.out.println(Arrays.toString(ints));

        System.out.println("---------------sort:排序----------------------");
        // sort:排序默认情况下，给基本数据类型进行升序排列。底层使用的是快速排序。
        //默认的升序
        int[] arr2 = {2, 5, 1, 4, 3, 8, 6, 7, 9};

        Arrays.sort(arr2);
        System.out.println(Arrays.toString(arr2)); //[1, 2, 3, 4, 5, 6, 7, 8, 9]

        //降序需要自定义
        //排序的数组需要转换成对应的包装类
        Integer[] arr3 = new Integer[arr2.length];
        for (int i1 = 0; i1 < arr2.length; i1++) {
            arr3[i1] = arr2[i1]; // 自动装箱，将 int 转换为 Integer
        }
        //重写对应的sort方法
        //底层原理：
        //利用插入排序＋二分查找的方式进行排序的
        //升序：o1 - o2
        //降序：o2 - o1 或 -1
        Arrays.sort(arr3, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
//                return o2 - o1;
                return -1;//以上同效
            }
        });

        System.out.println(Arrays.toString(arr3));//[9, 8, 7, 6, 5, 4, 3, 2, 1]

    }
}
